#include "loop.h"

/*
*功能：创建一个单向循环链表
*参数: 
    无
*返回值: 
成功，返回 : 返回头节点的地址
失败，返回 : NULL
*/
LoopLinkList_t *LoopLinkListCreate()
{
    LoopLinkList_t *H;
    
    //1、分配空间
    H = (LoopLinkList_t *)malloc(sizeof(LoopLinkList_t));
    if(H == NULL)
    {
        printf("Create_LoopLinkList error!\n");
        return NULL;
    }

    //2、初始化
    H->data = 0;
    H->next = H;

    return H;
}

/*
*功能：单向循环链表头插法
*参数: 
    *  @:  H :  头节点的地址
    *  @: data : 插入的节点数据 
*返回值: 
成功，返回 : 0
失败，返回 : -1
*/

int LoopLinkListInseterHead(LoopLinkList_t *H,datatype data)
{
    LoopLinkList_t *temp;

    temp = (LoopLinkList_t *)malloc(sizeof(LoopLinkList_t));
    if(temp == NULL)
    {
        printf("%s error!\n",__func__);
        return -1;
    }

    temp->data = data;

    //插入节点
    temp->next = H->next;
    H->next = temp;

    return 0;
}

/*
*功能：单向循环链表的遍历
*参数: 
   *  @:  H :  头节点的地址
*返回值: 
    无
*/
void LoopLinkListShow(LoopLinkList_t *H)
{
    LoopLinkList_t *Save_H = H;
    while(H->next != Save_H)
    {
        H = H->next;
        printf("-%d",H->data);
    }

    putchar(10);
}

int loopisempty(LoopLinkList_t*H)//判空函数
{
    return  H->next == NULL? 0 : -1;
}

int LoopLinkListInsetertail(LoopLinkList_t *H,datatype data)//尾插法
{
    LoopLinkList_t* temp;
    temp = (LoopLinkList_t *)malloc(sizeof(LoopLinkList_t));
    if(temp == NULL)
    {
        printf("%s error!\n",__func__);
        return -1;
    }
    LoopLinkList_t* save;
    save = H;
    while(H->next!=save)
    {
        H = H->next;
    }

    temp->data = data ;

    temp-> next = save;
    H->next = temp;
    return 0;
}

int slooplinkinsert(LoopLinkList_t *H,datatype data,int pos ) //按位置插入
{
    LoopLinkList_t *temp;
      LoopLinkList_t *save;
      save  =  H;
    if(temp == NULL)
    {
         printf("%s error!\n",__func__);
        return -1;
    }
    if(pos<0)
    {
        printf("插入位置不对\n");
        return -1;
    }

    while(H->next!=save || pos==0)
    {
        if(pos!=0)
        {
            H = H->next;
            pos--;
        }
        if(pos == 0)
        {
            temp = ( LoopLinkList_t*)malloc(sizeof(LoopLinkList_t));
            temp->data = data;
            temp->next = H->next;
            H->next = temp;
            return 0;
        }

    }
    printf("插入位置不对\n");
    return -1;
}

int loopheaddeleet(LoopLinkList_t *H)//头删除
{
    if(loopisempty == 0)
    {
        printf("链表为空\n");
        return -1;
    }
    LoopLinkList_t *temp;
    temp = H->next;
    datatype savedata = temp->data;

    H->next = temp->next;
    if(temp!=NULL)
    {
    free(temp);
    temp = NULL;
    }
    return savedata;
}

int looptaildelete(LoopLinkList_t *H)//尾删除
{
    //1、判空
    if(loopisempty == 0)
    {
        printf("链表为空\n");
        return -1;
    }
    //2、保存单链循环链表头节点，把头指针向后偏移
    LoopLinkList_t *temp;
    LoopLinkList_t *save;
    save = H;
    while(H->next->next!=save)
    {
        H = H->next;
    }
    //3、赋值
    temp = H->next;
    datatype savedata = temp->data;
    //4、删除
    H->next = temp->next;
    //5、释放
    if(temp!=NULL)
    {
    free(temp);
    temp = NULL;
    }
    return savedata;
}

int sloopdelete(LoopLinkList_t*H,int pos )//按位置删除
{
    //1、判空
    if(loopisempty == 0)
    {
        printf("链表为空\n");
        return -1;
    }
    if(pos<0)
    {
        printf("%s error\n",__func__);
        return -1;
    }
    LoopLinkList_t* head;
    head = H;
    while(H->next!=head)
    {
        if(pos!=0)
        {
            H = H->next;
            pos--;
        }
        if(pos == 0)
        {
            LoopLinkList_t* temp;
            temp = H->next;
            datatype savedata = temp->data;

            H->next = temp->next;
            if(temp!=NULL)
            {
                free(temp);
                temp = NULL;
            }
            return savedata;
        }
    }
        printf("删除位置不对\n");
        return -1;
}   